<?php

/*
	* To change this license header, choose License Headers in Project Properties.
	* To change this template file, choose Tools | Templates
	* and open the template in the editor.
	*/

class	Bench_Parse	extends	Codebench	{

				// Some optional explanatory comments about the benchmark file.
				// HTML allowed. URLs will be converted to links automatically.
				public	$description	=	'Chopping off leading digits: regex vs ltrim.';
				// How many times to execute each method per subject.
				// Total loops = loops * number of methods * number of subjects
				public	$loops	=	1000;
				private	static	$array	=	array(
								'А'	=>	array('А',	'A'),
								'В'	=>	array('В',	'B'),
								'С'	=>	array('С',	'C'),
								'Е'	=>	array('Е',	'E'),
								'Н'	=>	array('Н',	'H'),
								'К'	=>	array('К',	'K'),
								'М'	=>	array('М',	'M'),
								'О'	=>	array('О',	'O'),
								'Р'	=>	array('Р',	'P'),
								'Т'	=>	array('Т',	'T'),
								'Х'	=>	array('Х',	'X'),
								'а'	=>	array('а',	'a'),
								'с'	=>	array('с',	'c'),
								'е'	=>	array('е',	'e'),
								'о'	=>	array('о',	'o'),
								'р'	=>	array('р',	'p'),
								'у'	=>	array('у',	'y'),
								'х'	=>	array('х',	'x'),
				);
				// The subjects to supply iteratively to your benchmark methods.
				public	$subjects	=	array
								(
								'[[{Здравствуйте!|Привет!|Доброго времени суток!|Приветствуем Вас!}
Если Вы {открыли|нашли|перешли на|смотрите} наше объявление, значит мы {те, кто может выполнить работы,|можем выполнить работы,} которые Вас интересуют.
Потому, можете не читать текст объявления до конца, а сразу набирать наш номер:
{89002849888|89189789980|89648931467|89182643703}.
Ведь по телефону быстрее {поинтересоваться,|узнать то, что интересует|узнать то, что нужно,} все обсудить и даже успеть поторговаться.
Мы {опытные специалисты |опытная бригада |слаженная бригада | мастера своего дела |сплоченная бригада}. В {огромный|обширный|широкий|необъятный} {спектр|состав|список|диапазон|перечень} наших {работ|услуг} входят:
[укладка кафельной плитки,|укладка ламината,|укладка тротуарной плитки,|укладка кирпича,|укладка газобетона,|укладка шлакоблоков,|укладка газоблоков,|укладка паромакса,|ремонт квартир,|ремонт домов,|ремонт ванных комнат,|под ключ и частично,|отделка,|отделочные работы,|отделка квартир,|отделка домов,|отделка помещений,|строительство домов,|строительство коттеджей,|строительство бань,|строительство гаражей,|строительство под ключ,|заливка фундамента,|заливка полов,|заливка бетона,|заливка пола,|штукатурка,|штукатурные работы,|штукатурка стен,|ванные комнаты,|лестницы,|цоколь,|изготовление лестниц,|установка сантехники,|сантехнические работы,|электромонтажные работы] и многое другое.]]',
								'SeoGenerator { PRO|} { - |:} {программа, предназначенная|программный продукт, предназначенный} для {генерации|создания} уникальных [+,+описаний сайтов|названий сайтов|{анкоров|текстов ссылок}].Поддерживаются [+,+[+ и +переборы|перестановки]|вложенный синтаксис].',
				);

				public	function	bench_parse($subject)	{
								$output	=	$this->parseTagsRecursive0($subject);
								$output	=	$this->parseTagsRecursive1($output);
								$output	=	$this->parseTagsRecursive2($output);
								$output	=	$this->parseTagsRecursive1($output);
								$output	=	$this->parseTagsRecursive2($output);
								$output	=	preg_replace('#([a-z])#si',	"<b style='color:red'>\\1</b>",	$output);
								$output	=	str_replace('f',	'',	$output);
								return	$output;
				}

				private	function	parseTagsRecursive0($input)	{
								$regex	=	'#\[\[(.*?)\]\]#si';
								if	(is_array($input))	{
												$chars	=	UTF8::str_split($input[1]);
												//print_r(self::$array);
												foreach	($chars	as	&$char)	{
																if	(!empty(self::$array[$char]))	{
																				$char	=	self::$array[$char][array_rand(self::$array[$char])];
																}
												}
												$input	=	implode('',	$chars);
								}
								return	preg_replace_callback($regex,	array($this,	'parseTagsRecursive0'),	$input);
				}

				private	function	parseTagsRecursive1($input)	{
								$regex	=	'#{([^{}]+)}#si';
								if	(is_array($input))	{
												$arr	=	explode('|',	$input[1]);
												$input	=	$arr[array_rand($arr)];
								}
								return	preg_replace_callback($regex,	array($this,	'parseTagsRecursive1'),	$input);
				}

				private	function	parseTagsRecursive2($input)	{
								$regex	=	'#\[([^\[\]]+)\]#si';
								if	(is_array($input))	{
												$arr	=	explode('|',	$input[1]);
												$implode	=	'';
												if	(preg_match('#\+(.*?)\+#si',	$arr[0],	$m))	{
																$arr[0]	=	str_replace($m[0],	'',	$arr[0]);
																$implode	=	$m[1];
												}
												shuffle($arr);
												$input	=	implode($implode,	$arr);
								}
								return	preg_replace_callback($regex,	array($this,	'parseTagsRecursive2'),	$input);
				}

}
